慢慢的在還之前的債,發現拿 AI 寫這種文章還是挺不適合的 ,有寫好的再 link 過去
Block 頁列出末端,是為了回答「現在」。Version 頁回答另一個問題:這一條線從哪裡走到這裡,沿途的數字怎麼變。 沒有父親欄,這個頁不存在。有父親但對不上,這個頁會撒謊——看起來像兩次獨立的根,或把無關的 run 串成一家。所以這堂課先把樹怎麼在瀏覽器裡長出來講清楚,再講頁面上的譜系條與並排表。
交叉比對兩個不相干版本(A 與 B 隨便挑)是以後的題。今天只做 有血緣的並排:從根到目前節點的那一串。血緣來自上傳裡的 father,不是來自檔名長得像。
同一顆 block、同一個階段(APR 或 ECO)的上傳,會被收成一棵樹。每個節點帶著整理後的指標與身分。組樹的步驟固定,結果長這樣:
父親欄把三次 run 串起來(同一顆、同一階段)
v1(沒有父親 = 根)
│
▼
v2
│
▼
v3(沒有小孩 = 葉子) ← Block 頁只畫這一列
Version 頁沿著 v3 往回走:v1 → v2 → v3
並排表的每一欄,就是沿途每一站的同一個指標
先把這些上傳做成 id 索引,並把檔名、upload_id、整理後的 id 都登記成別名。再讀每一筆的 father:空就是沒有父親;有值就依「正好是某個 id、或某個別名、或路徑的最後一段是某個別名」去解。解到自己、或解到不存在的點,當成沒有父親,免得成環或指向幽靈。沒有父親的是根,沒有小孩的是葉子。
小孩依日期排,根依日期排,葉子依日期新到舊排。Block 頁用葉子;Version 頁用某一點的 path_to_root 去把節點串成鏈。同一份上傳不會同時活在 APR 樹與 ECO 樹上——階段在正規化時就分開了。ECO 的父親應指向另一次 ECO,或至少是你有意承認的血緣;亂指到 APR 的檔名,別名若碰巧撞上,譜系會串錯家。第一條防衛仍是 Day 16:階段鑰匙先對。
這棵樹放進快取,鍵是製程、專案、block、階段。刷新才重組。現場若剛丟了新檔卻還看舊葉子,先刷新,再懷疑組樹。
上傳的人可能寫另一份的 id、寫完整檔名、寫含目錄的路徑、寫 ROOT、寫空。寬的部分是:空白與那些「沒有父親」的詞當成根;路徑只取最後一段再去對別名。不能聰明過頭的部分是:不要因為版本字串像,就自動認親;不要跨 block 去找同名檔;不要跨 APR/ECO 亂認。認錯比不認更糟。不認,你得到兩棵根,人還能用眼睛看日期補故事。認錯,Version 頁會把別人的 DRC 畫進這條線,會議上會做出錯誤決策。
別名表是雙面刃。它讓「檔名」與「id」能互指,這是實務上必須的。但兩次 run 若共用極短的別名,後寫入索引的會蓋過先寫的。id 必須在這一輪載入裡唯一;來源檔名在目錄裡本來就唯一。能當父親的,優先用不會撞的那種。寫流程的人在 TCL dict 裡填父親時,填對方的檔名或 upload_id,比填一個短版本號安全。
成環要停。A 指 B、B 指 A,往根走若不擋,頁會卡死。擋住之後,這條線的 path_to_root 會偏短,畫面可能看起來像根。症狀是「譜系少一截」。修資料,不要在畫面做無限上一頁。
進頁時,資料包帶目前節點、整棵樹、從根到它的鏈、以及回到葉子表的連結。找不到節點——網址裡的 id 已不在樹上——是另一種資料包:一句錯誤與一顆返回。不要畫空表假裝還在。
找得到,標題用版本名(沒有就用 id),底下是專案、block、以及譜系文字。第一段身體是譜系條:鏈上每一步是可點的階段加版本,目前這步標出來,中間用箭頭連。點另一步,就是進那個節點的 Version 頁,不是回 Block。這讓你在同一條血緣上前後走,不必先回葉子表。
譜系條是地圖,不是資料。它回答「這條線有幾站」。站數對不上你記得的次數,先查父親,再查是不是有一次被判去另一個階段。不要在譜系條上畫 DRC——數字一多,地圖會變成第二張表,兩張表打架。
第二段身體是一組表。先來一張 meta:版本、負責人、上傳者、日期、runtime、design。再依鏈上出現過的指標區段各來一張:利用率、VT、密度、DRC……區段順序跟第一次在鏈上遇到的順序走,讓舊 run 沒有的新區段自然出現在後面,而不是整頁欄位重排到認不得。
每一張表的列是鏈上的每一站(用 stage 當列首),欄是這個區段裡長出來的鍵。欄的長法是走巢狀物件:第二層當欄,若還有第三層就當分組,再深的葉子收成「第三層.葉子」這種標籤。看起來像路徑的鍵與值會被跳過,避免工作目錄變成一欄。
同一條鏈上,早期 run 可能沒有後來才開始抽的鍵。欄仍在,空的格子顯示為「—」。這正是並排的意義:你看見 何時開始有這個數、這個數怎麼走。不要為了對齊去把舊 run 補零。補零會把「當時沒抽」變成「當時是零」,SignOff 與 DRC 都會被這一口假話毒到。
DRC 這類在箱子裡寫成 { value: 12 } 的形狀,取值時要解開 value,不要把整包物件印到格子裡。這是顯示規則,不是改箱子。箱子仍保持工具倒出來的層級,畫面知道哪一種包裝要拆。
表可以很寬。橫向捲動是預期,不要為了塞進螢幕就丟掉分組。工程師對欄的記憶來自報告的層級:all、short、某一種 violation。分組標題在,對帳才快。列首 sticky 住 stage,左右捲時仍知道自己在看哪一站。這是 Version 頁少數值得做的「美術」——為了核對,不是為了好看。
不做任意兩個版本的挑選器。那是交叉比對,血緣約束一拿掉,欄的語意就變了:你不再看「沿途怎麼變」,而在看「兩次獨立事實差在哪」。兩者都需要,但不要塞進同一頁,以免父親欄變成可選裝飾。
不做圖表。第一版用表就夠。圖一上,人會開始討論座標軸,而不是討論格子裡的 12 是不是報告裡的 12。表對完,再談圖。
不做編輯。沒有人能在這頁改 DRC。改數字回工具裡的 dict,重新出門。Version 頁是只讀的放大鏡。
準備三次 APR:第一次無父親,第二次父親指第一次,第三次父親指第二次。Block 頁 APR 門應只見第三次那片葉子。點進去,譜系條三站,目前是第三。並排表三列,meta 的版本三個都在。點譜系條第二站,目前標移過去,表仍三列(鏈是從根到目前,若目前是第二站,應變兩列)。這個差異能證明頁面吃的是 path_to_root,不是整棵樹所有節點。
再故意把第三次的父親寫成不存在的名字。第三次應變成另一個根,Block 頁出現兩片葉子。這是「不認比認錯好」的現場味道。修好父親、刷新,葉子回到一片。